home *** CD-ROM | disk | FTP | other *** search
/ Mac Format 1994 October / Macformat17.cdr / Shareware City / Developers / shutdown-fx-201-c / sfx ƒ / sfx control app ƒ / Shell ƒ / progress.c < prev    next >
Text File  |  1994-07-11  |  7KB  |  211 lines

  1. /**********************************************************************\
  2.  
  3. File:        progress.c
  4.  
  5. Purpose:    This module handles the progress bar and dealing with
  6.             events while the progress bar is up.
  7.             
  8. This program is free software; you can redistribute it and/or modify
  9. it under the terms of the GNU General Public License as published by
  10. the Free Software Foundation; either version 2 of the License, or
  11. (at your option) any later version.
  12.  
  13. This program is distributed in the hope that it will be useful,
  14. but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. GNU General Public License for more details.
  17.  
  18. You should have received a copy of the GNU General Public License
  19. along with this program in a file named "GNU General Public License".
  20. If not, write to the Free Software Foundation, 675 Mass Ave,
  21. Cambridge, MA 02139, USA.
  22.  
  23. \**********************************************************************/
  24.  
  25. #include "Power.h"
  26. #include "program globals.h"
  27. #include "progress.h"
  28. #include "dialogs.h"
  29. #include "environment.h"
  30. #include "menus.h"
  31. #include "graphics.h"
  32. #include "main.h"
  33.  
  34. enum
  35. {
  36.     progressDialogID = 210,
  37.     progressText = 1,
  38.     progressBar = 2
  39. };
  40.  
  41. DialogPtr        gProgressDlog=0L;        /* pointer to progress dialog */
  42. short            gOldForegroundWaitTime;
  43.  
  44. /*-----------------------------------------------------------------------------------*/
  45. /* internal stuff for progress.c                                                     */
  46.  
  47. static    Rect            box;                /* box of actual progress bar in dialog */
  48. static    unsigned long    curProgress;        /* current progress value */
  49. static    unsigned long    maxProgress;        /* maximum progress value */
  50.  
  51. static pascal void DrawProgressBar(WindowPtr theWindow, short item);
  52.  
  53.  
  54. static pascal void DrawProgressBar(WindowPtr theWindow, short item)
  55. /* the useritem procedure for the actual progress bar in the dialog */
  56. {
  57.     Rect                tempBox;
  58.     unsigned long        length;
  59.     unsigned long        width;
  60.     long double            temp;
  61.     
  62.     SetPort(theWindow);        /* the dialog */
  63.     FrameRect(&box);        /* progress area outline */
  64.     
  65.     length = box.right - box.left;
  66.     width = length * curProgress;
  67.     if ((width / length) != curProgress)    /* if we have overflow problems... */
  68.     {                                        /* use long double math instead */
  69.         temp = ((long double)curProgress) / ((long double)maxProgress);
  70.         width = temp * length;
  71.     }
  72.     else width /= maxProgress;
  73.     
  74.     tempBox = box;
  75.     InsetRect(&tempBox, 1, 1);
  76.     tempBox.left += width;
  77.     FillRect(&tempBox, ltGray);        /* gray background in progress area */
  78.     
  79.     tempBox = box;
  80.     InsetRect(&tempBox, 1, 1);
  81.     tempBox.right = tempBox.left + width - 1;
  82.     ForeColor(cyanColor);
  83.     PaintRect(&tempBox);            /* paint progress area as much as we've progressed */
  84.     ForeColor(blackColor);            /* important!  always set ForeColor back to black */
  85. }
  86.  
  87. DialogPtr OpenProgressDialog(unsigned long max, Str255 theTitle)
  88. {
  89.     short            itemType;
  90.     Handle            itemH;
  91.     Rect            otherBox;
  92.     
  93.     PositionDialog('DLOG', progressDialogID);    /* see dialogs.c */
  94.     /* get the progress dialog from .rsrc file */
  95.     
  96.     gProgressDlog = GetNewDialog(progressDialogID, 0L, (WindowPtr)-1L);
  97.     if (gProgressDlog == 0L)
  98.         return 0L;
  99.     
  100.     /* set up useritem procedure to draw the progress area (see above) */
  101.     GetDItem(gProgressDlog, progressBar, &itemType, &itemH, &box);
  102.     SetDItem(gProgressDlog, progressBar, userItem + itemDisable, (ProcPtr)DrawProgressBar, &box);
  103.     
  104.     curProgress = 0;        /* start at empty */
  105.     maxProgress = max;        /* max value as passed in parameter */
  106.     
  107.     SetWTitle((WindowPtr)gProgressDlog, theTitle);    /* set title as passed in parameter */
  108.     
  109.     ShowWindow(gProgressDlog);    /* show it */
  110.     DrawDialog(gProgressDlog);    /* draw it */
  111.     
  112.     UpdateProgressDialog(0);    /* draw progress area as empty (zero progress) */
  113.     
  114.     gOldForegroundWaitTime=gForegroundWaitTime;
  115.     gForegroundWaitTime=0;
  116.     
  117.     gInProgress=TRUE;            /* so we know progress bar is up */
  118.     AdjustMenus();                /* dims almost everything */
  119.     DrawMenuBar();                /* needed so menus look dimmed immediately */
  120.     
  121.     return gProgressDlog;
  122. }
  123.  
  124. void SetProgressText(Str255 p1, Str255 p2, Str255 p3, Str255 p4)
  125. {
  126.     Str255            totalStr;
  127.     unsigned char    i;
  128.     short            itemType;
  129.     Handle            itemH;
  130.     Rect            otherBox;
  131.     
  132.     /* DON'T use ParamText to set text in progress dialog.  ParamText handles are
  133.        low-mem globals and can be changed if you switch out of the application and
  134.        another program displays an alert/dialog with ParamText strings.  Instead,
  135.        add up all four strings into one big string (max 255 characters total) and
  136.        sets the dialog item to be that text. */
  137.     totalStr[0]=0x00;
  138.     for (i=1; i<=p1[0]; i++)
  139.         totalStr[++totalStr[0]]=p1[i];
  140.     for (i=1; i<=p2[0]; i++)
  141.         totalStr[++totalStr[0]]=p2[i];
  142.     for (i=1; i<=p3[0]; i++)
  143.         totalStr[++totalStr[0]]=p3[i];
  144.     for (i=1; i<=p4[0]; i++)
  145.         totalStr[++totalStr[0]]=p4[i];
  146.     GetDItem(gProgressDlog, 1, &itemType, &itemH, &otherBox);
  147.     SetIText(itemH, totalStr);
  148. }
  149.  
  150. void UpdateProgressDialog(unsigned long cur)
  151. {
  152.     curProgress = cur;        /* set our global variable of current progress */
  153.     if (curProgress >= maxProgress)        /* can't be >= than max progress */
  154.         curProgress = maxProgress-1;
  155.     
  156.     SetPort(gProgressDlog);
  157.     
  158.     DrawProgressBar(gProgressDlog, progressBar);    /* draw progress area manually */
  159.     
  160.     if (gHasPowerManager)    /* so Powerbooks won't go down to 1 MHz during a */
  161.         IdleUpdate();        /* lengthy progress operation */
  162. }
  163.  
  164. void DismissProgressDialog(void)
  165. {
  166.     if (gProgressDlog!=0L)        /* so you can be sloppy and dismiss it even if it's */
  167.         DisposDialog(gProgressDlog);    /* not up (: */
  168.     gProgressDlog=0L;            /* so we know it's gone */
  169.     gInProgress=FALSE;            /* not in progress anymore */
  170.     gForegroundWaitTime=gOldForegroundWaitTime;
  171.     AdjustMenus();                /* so adjust menus accordingly */
  172.     DrawMenuBar();                /* and redraw menubar to see effect immediately */
  173. }
  174.  
  175. #define TheCancelKey    '.'
  176.  
  177. Boolean DealWithOtherPeople(void)
  178. {
  179.     /* this is just a small useful function to see if the user has cancelled */
  180.     /* a lengthy operation with command-period; could come in handy, I suppose, */
  181.     /* in a somewhat bizarre set of circumstances... */
  182.     /* Note that this procedure will break under AUX */
  183.     /* Note also that this returns TRUE if there has been no attempt to cancel */
  184.     
  185.     Boolean            foundEvent;
  186.     EvQElPtr        eventQPtr;
  187.     QHdrPtr            eventQHdr;
  188.     char            thisChar;
  189.     long            isCmdKey;
  190.     
  191.     foundEvent=FALSE;
  192.     eventQHdr=GetEvQHdr();
  193.     eventQPtr=(EvQElPtr)(eventQHdr->qHead);
  194.     while ((eventQPtr!=0L) && (!foundEvent))
  195.     {
  196.         if (eventQPtr->evtQWhat==keyDown)
  197.         {
  198.             thisChar=(char)((eventQPtr->evtQMessage)&charCodeMask);
  199.             isCmdKey=(eventQPtr->evtQModifiers)&cmdKey;
  200.             if (isCmdKey!=0L)
  201.                 foundEvent=(thisChar==TheCancelKey);
  202.         }
  203.         if (!foundEvent)
  204.             eventQPtr=(EvQElPtr)(eventQPtr->qLink);
  205.     }
  206.  
  207.     while (HandleSingleEvent());
  208.     
  209.     return !foundEvent;
  210. }
  211.